package com.cn.ycy.proxy.cglib;

import com.cn.ycy.proxy.jdk.Student;
import org.junit.Test;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;


/**
 * spring 提供的 cglib
 */
public class CglibDemo {

  @Test
  public void test2() {

    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(Student.class);

//    cglib 提供 的Interceptor
    enhancer.setCallback(new MethodInterceptor() {
      @Override
      public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("出门带口罩");
        return methodProxy.invokeSuper(o, objects);
      }
    });

    // 这个 可以 向构造器传递入参
    Object o = enhancer.create(new Class[]{String.class}, new Object[]{"a"});
    Student userDaoPoxy = (Student) o;

    userDaoPoxy.doWork();

    /**
     * 这个地方 无法cglib 拦截，因为 调用的方法别被 final 修饰了
     */
    userDaoPoxy.doWorkfinal();

  }

}
